swc 0.87.4

Speedy web compiler
Documentation
The main crate of the swc project. # Customizing This is documentation for building custom build tools on top of swc. ## Dependency version management `swc` has [swc_ecmascript](https://docs.rs/swc_ecmascript) and [swc_css](https://docs.rs/swc_css), which re-exports required modules. ## Testing See [testing] and [swc_ecma_transform_testing](https://docs.rs/swc_ecmc_transform_testing). ## Custom javascript transforms ### What is [JsWord](swc_atoms::JsWord)? It's basically an interned string. See [swc_atoms]. ### Choosing between [JsWord](swc_atoms::JsWord) vs String You should prefer [JsWord](swc_atoms::JsWord) over [String] if it's going to be stored in an AST node. See [swc_atoms] for detailed description. ### Fold vs VisitMut vs Visit See [swc_visit] for detailed description. - [Fold](swc_ecma_visit::Fold) - [VisitMut](swc_ecma_visit::VisitMut) - [Visit](swc_ecma_visit::Visit) ### Variable management (Scoping) See [swc_ecma_transforms_base::resolver::resolver_with_mark]. #### How identifiers work See the doc on [swc_ecma_ast::Ident] or on [swc_ecma_transforms_base::resolver::resolver_with_mark]. #### Comparing two identifiers See [swc_ecma_utils::Id]. You can use [swc_ecma_utils::IdentLike::to_id] to extract important parts of an [swc_ecma_ast::Ident]. #### Creating a unique identifier See [swc_ecma_utils::private_ident]. #### Prepending statements If you want to prepend statements to the beginning of a file, you can use [swc_ecma_utils::prepend_stmts] or [swc_ecma_utils::prepend] if `len == 1`. These methods are aware of the fact that `"use strict"` directive should be first in a file, and insert statements after directives. ### Improving readability Each stuffs are documented at itself. - If you are creating or binding an [swc_ecma_ast::Expr] with operator, you can use [swc_ecma_ast::op]. - If you want to create [swc_ecma_ast::CallExpr], you can use [swc_ecma_utils::ExprFactory::as_callee] to create `callee`. - If you want to create [swc_ecma_ast::CallExpr] or [swc_ecma_ast::NewExpr], you can use [swc_ecma_utils::ExprFactory::as_arg] to create arguments. - If you want to create [swc_ecma_ast::MemberExpr] where all identifiers are static (e.g. `Object.prototype.hasOwnProperty`), you can use [swc_ecma_utils::member_expr]. - If you want to create [swc_ecma_ast::MemberExpr], you can use [swc_ecma_utils::ExprFactory::as_obj] to create object field. ### Reducing binary size The visitor expands to a lot of code. You can reduce it by using macros like - [noop_fold_type](swc_ecma_visit::noop_fold_type) - [noop_visit_mut_type](swc_ecma_visit::noop_visit_mut_type) - [noop_visit_type](swc_ecma_visit::noop_visit_type) Note that this will make typescript-related nodes not processed, but it's typically fine as `typescript::strip` is invoked at the start and it removes typescript-specific nodes. ### Porting `expr.evaluate()` of babel See [swc_ecma_minifier::eval::Evaluator].